import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserInfo, getUserDatailById } from '@/api/user'
import { resetRouter } from '@/router'

const state = {
  // 设置token的共享状态 token持久化=>放到缓存中
  token: getToken(),
  // 定义一个空对象userInfo,后面开发需要userinfo的属性给别人用
  userInfo: {}
}

// 修改状态
const mutations = {
  // 设置用户token
  setToken(state, token) {
    state.token = token // 设置token给vuex
    setToken(token) // 同步token到vuex 缓存数据的同步
  },
  // 删除缓存token
  removeToken(state) {
    state.token = null // 将token设置为空
    removeToken() // 删除token 再清除缓存vuex 和 缓存数据同步
  },
  // 设置用户信息
  setUserInfo(state, userInfo) {
    // 用浅拷贝的方法去赋值对象, 因为这样数据更新之后, 才会触发组件更新
    state.userInfo = { ...userInfo }
  },
  // 删除用户信息
  removeUserInfo(state) {
    state.userInfo = {}
  }
}

// 执行异步
const actions = {
  // 定义 login action 也需要参数 调用action时 传递过来的参数
  async login(context, data) {
    const result = await login(data) // 实际就是一个promise result就是执行的结果
    // axios默认给数据加了一层data
    // if (result.data.success) {  request文件已经默认去除data的外衣，可以不用在执行一次
    // 表示登录接口调用成功  也就是意味着用户名和密码正确
    // 现在有token
    // actions 修改state 必须通过mutations
    context.commit('setToken', result)
    // }
    // 写入时间戳
    // 当前时间
    setTimeStamp()
  },

  // 获取用户资料action
  async getUserInfo(context) {
    // 获取返回值
    const result = await getUserInfo()
    // 为了获取头像
    const baseInfo = await getUserDatailById(result.userId)
    // 将两个接口合并
    const baseResult = { ...result, ...baseInfo }
    // 此时已获得用户基本资料,需要再次调用接口才能拿到头像
    // 提交给mutations设置
    context.commit('setUserInfo', baseResult)
    // 留下伏笔
    return baseResult
  },

  // 登出的action
  lgout(context) {
    // 1.删除token
    // 不仅仅删除vuex中的,还得删缓存的
    context.commit('removeToken')
    // 2.删除用户信息
    context.commit('removeUserInfo')
    // 重置路由
    resetRouter()
    // vue中的数据是不是还在
    // 要清空permission模块下的state数据
    // vuex中的user子模块 permission子模块
    // 子模块刁永刚子模块的action 默认情况下 子模块的context是子模块的
    // 父模块 调用 子模块的action
    context.commit('permission/setRoutes', [], { root: true })
    // 子模块调用子模块的action 可以将 commit的第三个参数 设置成{root:true} 就表示当前的context不是子模块了 而是父模块
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

